#include <memory>

using namespace std;

struct A {
    int data;
};

#include <pthread.h>
#include <thread>
#include <iostream>
//volatile int g_test = 0;
int g_test = 0;

void fun() {
    for (int i = 0; i < 800000; i++) {
    
        int old = g_test;
    //    while (!__sync_bool_compare_and_swap(&g_test, old, old + 1)) { // g_test 和old值相比 如果相同就让 g_test = old+1  
                old = g_test;    
        while (!__sync_bool_compare_and_swap(&g_test, g_test , g_test +1 )) {   //这种方式似乎有问题 ，数据量大测试结果会出现多线程问题， 
        }
    //    g_test++;
    }
    std::cout << g_test << endl;
}


int main()
{
    thread thread1(fun);
    thread thread2(fun);
    thread1.detach();
    thread2.detach();
    getchar();
    return 0;
}

// 1. i累加5000次时， volatile int 不会出现多线程问题  int会，当i够大时，volatile  int 和 int 都会出现多线程问题
// 2. cas下 似乎不加编译选项也可以防止多线程问题

